package common

import (
	"go-gin/model"
	"time"

	"github.com/dgrijalva/jwt-go"
)

//jwt加密秘钥
var jwtKey = []byte("a_secret_crect")

//claim:token的数据声明
type Claims struct {
	UserId uint
	jwt.StandardClaims
}

//登录成功时用此方法发放token
func ReleaseToken(user model.User) (string, error) {
	expirationTime := time.Now().Add(7 * 24 * time.Hour)
	claims := &Claims{
		UserId: user.ID,
		StandardClaims: jwt.StandardClaims{ // 里面可以随便写
			ExpiresAt: expirationTime.Unix(), //token过期时间（有效期）
			IssuedAt:  time.Now().Unix(),     //token发放时间
			Issuer:    "shadowwink",          //发放人
			Subject:   "user token",          //主题
		},
	}
	//对token进行加密的函数NewwithClaims 第一个参数为alg又称加密算法,第二个参数为数据声明如claims
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err := token.SignedString(jwtKey)

	if err != nil {
		return "", err
	}

	return tokenString, nil
}

//验证前端传回的token
func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
	claims := &Claims{}

	//对token进行解密的函数ParseWithClaims 第一个参数为加密后的token, 第二个为传入的自定义Claims结构体, 第三个是自带的回调函数，将秘钥和错误返回
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (i interface{}, err error) {
		return jwtKey, err
	})

	return token, claims, err
}
